home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Environments / PowerFantasm™ 4.19a / Beginners guide / GUIDE EXAMPLES / EXAMPLE10.S < prev    next >
Text File  |  1997-04-01  |  4KB  |  103 lines

  1. ********************************************************************************
  2. *EXAMPLE 10 - draw a multi coloured box using draw_h_line                      *
  3. *AUTHOR    - STUART BALL JULY 94                                               *
  4. *SCREEN MUST BE SET TO 256 COLOUR MODE FOR THIS EXAMPLE                        *
  5. ********************************************************************************
  6. SCREENROW:    EQU    $0106    *WIDTH OF EACH SCREEN LINE
  7. DEVICELIST:    EQU    $08A8    *THE ADDRESS OF DEVICELIST
  8. gdPMap_offset:    EQU    22
  9. EXAMPLE10:    MOVEM.L    A5-A6,-(SP)    *SAVE MAC WORLD
  10.     BSR    INIT    *INITIALISE OUR VARIABLES
  11.     BSR    CLS    *CLEAR THE SCREEN
  12.     BSR    DRAW_MULTI_BOX    *DRAW MULTI COLOURED BOX
  13.     MOVEM.L    (SP)+,A5-A6    *RESTORE MAC WORLD
  14.     RTS
  15. ************************END OF EXAMPLE 10***************************************
  16.  
  17. **INIT SETS UP OUR VARIABLES
  18. INIT:    LEA    MY_VARS(PC),A6    *A6 IS OUR VARIABLE POINTER
  19.     MOVE.L    DEVICELIST,A0
  20.     MOVE.L    (A0),A0    *POINT TO DEVICELIST
  21.     MOVE.L    A0,A1    *COPY ADDRESS OF DEVICE LIST
  22.     MOVE.L    gdPMap_offset(A1),A1    *A1=POINTER TO GDPMAP
  23.     MOVE.L    (A1),A1        *gdPMap IN A1
  24.     MOVE.W    10(A1),NUMB_OF_LINES(A6)    *SAVE NUMBER OF LINES
  25.     MOVE.L    (A1),VRAM_ADDR(A6)    *SAVE VRAM ABSOLUTE ADDRESS
  26.     RTS
  27.     
  28. **CLS CLEARS THE MAC SCREEN TOTALLY
  29. **PRESERVES ALL REGISTERS
  30. CLS:    MOVEM.L    D0-D2/A1,-(SP)    *SAVE REGS
  31.     
  32.     CLR.L    D0
  33.     CLR.L    D1
  34.     CLR.L    D2
  35.     
  36.     MOVE.L    VRAM_ADDR(A6),A1    *VRAM ADDRESS IN A1
  37.     MOVE.W    NUMB_OF_LINES(A6),D0    *NUMBER OF LINES ON SCREEN
  38.     SUBQ.W    #1,D0    *DBcc ALWAYS LOOPS ONE MORE THAN THE COUNT
  39.     MOVE.W    SCREENROW,D1    *WIDTH IN BYTES OF EACH LINE
  40.     LSR.W    #2,D1    *DIVIDE BY FOUR AS WERE CLEARING LONGS
  41.     SUBQ.W    #1,D1    *DBRA ALWAYS LOOPS 1 MORE THAN THE COUNT!
  42.     MOVE.W    D1,D2    *SAVE SIZE OF LINE(IN BYTES)
  43.  
  44. NEXT_LINE:
  45. CLEAR_LINE:    CLR.L    (A1)+    *CLEAR FOUR BYTES OF VRAM AND POINT TO NEXT
  46.     DBRA    D1,CLEAR_LINE    *CLEAR THIS LINE
  47.     MOVE.W    D2,D1    *RESET BYTES/LINE COUNTER
  48.     DBRA    D0,NEXT_LINE    *CLEAR NEXT LINE
  49.     
  50.     MOVEM.L    (SP)+,D0-D2/A1    *RESTORE REGS
  51.     RTS
  52.  
  53. **draw_multi_box uses draw_h_line to draw a box 255 by 255 in 255 colours!
  54. **needs no parameters
  55. DRAW_MULTI_BOX:    MOVE.L    #255,D2    *STARTING COLOUR
  56.     MOVE.L    #200,D0        *START X COORD OF LINE
  57.     MOVE.L    #455,D3        *END X COORDINATE OF LINE
  58.  
  59. DRAW_BOX:    MOVE.L    D2,D1    *Y COORDINATE OF LINE - SAME AS COLOUR
  60.     ADD.L    #100,D1        *OFFSET Y COORD DOWN 100 PIXELS
  61.     BSR.S    DRAW_H_LINE    *DRAW A HORIZONTAL LINE
  62.     DBRA    D2,DRAW_BOX    *DEC COLOUR, AND LOOP IF NOT ZERO
  63.     RTS
  64.     
  65. **DRAW_H_LINE DRAWS A HORIZONTAL LINE.
  66. **NEEDS START X COORDINATE IN D0
  67. **            Y COORDINATE IN D1
  68. **            LINE COLOUR IN D2
  69. **        END X COORDINATE IN D3
  70. DRAW_H_LINE:    MOVE.L    D0,-(SP)    *SAVE START COORDINATE
  71.     MOVE.L    VRAM_ADDR(A6),A1    *FOR PLOT
  72. DHL_LOOP:    BSR.S    PLOT    *PLOT THIS PIXEL
  73.     ADD.W    #1,D0        *INC X COORDINATE
  74.     CMP.W    D3,D0        *COMPARE WITH END COORDINATE
  75.     BNE.S    DHL_LOOP    *IF NOT THERE YET, DRAW NEXT PIXEL
  76.     MOVE.L    (SP)+,D0    *RESTORE START COORDINATE
  77.     RTS
  78.  
  79. **PLOT IS A SUBROUTINE THATS PLOTS A PIXEL ON THE SCREEN IN THE COLOUR HELD IN D2
  80. **NEEDS D0.W = X COORDINATE
  81. **      D1.W = Y COORDINATE
  82. **      D2.B = THE COLOUR
  83. **      A1   = VRAM BASE ADDRESS
  84. **ALL REGISTERS REMAIN UNAFFECTED
  85. PLOT:    MOVEM.L    D0-D3/A1,-(SP)    *SAVE THE REGISTERS WE USE
  86.     CLR.L    D3
  87.     MOVE.W    SCREENROW,D3    *GET PHYSICAL LENGTH OF EACH SCREEN LINE
  88.     MULS    D3,D1        *Y COORDINATE TIMES THE LENGTH OF EACH LINE
  89.     ADD.L    D0,D1        *VRAM ADDRESS OF THIS PIXEL
  90.     ADD.L    D1,A1        *ABSOLUTE ADDRESS OF THIS PIXEL
  91.     MOVE.B    D2,(A1)        *SET THE PIXEL TO THE COLOUR IN D2
  92.     MOVEM.L    (SP)+,D0-D3/A1    *RESTORE THE REGS TO HOW THEY WERE
  93.     RTS            *END OF SUBROUTINE PLOT
  94.     
  95.  
  96. *********************************VARIABLES FOLLOW********************************
  97.  
  98. MY_VARS:    DS.B    20    SPACE FOR OUR VARIABLES
  99.  
  100. ******************************OFFSETS INTO VARIABLES*****************************
  101.  
  102. NUMB_OF_LINES:    EQU    0    .W NUMBER OF PHYSICAL LINES ON SCREEN    
  103. VRAM_ADDR:        EQU    2    .L ABSOLUTE ADDRESS OF VRAM